Skip to content

chaos: vthread-context-cascade antagonist + glibc heap-corruption defaults#642

Open
jbachorik wants to merge 5 commits into
mainfrom
jb/vt_churn
Open

chaos: vthread-context-cascade antagonist + glibc heap-corruption defaults#642
jbachorik wants to merge 5 commits into
mainfrom
jb/vt_churn

Conversation

@jbachorik

@jbachorik jbachorik commented Jul 8, 2026

Copy link
Copy Markdown
Collaborator

What does this PR do?:
Adds a new vthread-context-cascade chaos antagonist that races tracer-style
context propagate/activate/restore semantics against virtual-thread carrier
churn, targeting the ContextStorageMode.THREAD stale-carrier
DirectByteBuffer use-after-free. Also defaults MALLOC_CHECK_/
MALLOC_PERTURB_ for glibc-backed test runs (chaos reliability runner and
the shared ddprof-test Gradle test-task configuration), turning silent
heap corruption into an immediate, attributable SIGABRT instead of a
crash much later in an unrelated allocation.

Motivation:
While building the vthread-context-cascade reproducer it became clear
that this class of use-after-free bug corrupts glibc heap/tcache metadata
silently and only manifests as a crash far later, in an unrelated
allocation call — making it unlikely to be caught within a short chaos
run or CI test window. Enabling glibc's own heap-corruption checks by
default closes that gap cheaply, without needing a sanitizer build (which
can't run against a live JVM, see reference_sanitizers_no_jvm).

Additional Notes:
The MALLOC_CHECK_/MALLOC_PERTURB_ defaults are skipped on musl (no
MALLOC_CHECK_ support) and whenever a sanitizer/allocator already
replaces malloc via LD_PRELOAD (ASan/TSan/tcmalloc/jemalloc configs),
mirroring the existing gmalloc vs tcmalloc/jemalloc mutual
exclusivity in chaos_check.sh.

How to test the change?:

  • ./gradlew :ddprof-stresstest:chaosJar builds cleanly with the new antagonist registered.
  • ./gradlew :build-logic:conventions:compileKotlin compiles cleanly with the ProfilerTestPlugin change.
  • Ran the antagonist standalone in a JDK21 container (-Dddprof.debug.context.storage.mode=thread, tuned virtual-thread scheduler flags, MALLOC_CHECK_=3/MALLOC_PERTURB_ set) for several minutes; no crash reproduced yet in this window — the antagonist is being landed as a reliability-suite addition to keep exercising this race over longer soak runs, not as a guaranteed-repro smoke test.

For Datadog employees:

  • If this PR touches code that signs or publishes builds or packages, or handles
    credentials of any kind, I've requested a security review (run the dd:platform-security-review
    skill, or file a request via the PSEC review form).
    bewaire also runs automatically on every PR.

  • This PR doesn't touch any of that.

  • JIRA: PROF-15360

Unsure? Have a question? Request a review!

@jbachorik jbachorik added the AI label Jul 8, 2026
@dd-octo-sts

dd-octo-sts Bot commented Jul 8, 2026

Copy link
Copy Markdown
Contributor

CI Test Results

Run: #29490747291 | Commit: a83b817 | Duration: 15m 38s (longest job)

All 32 test jobs passed

Status Overview

JDK glibc-aarch64/debug glibc-amd64/debug musl-aarch64/debug musl-amd64/debug
8 - - -
8-ibm - - -
8-j9 - -
8-librca - -
8-orcl - - -
11 - - -
11-j9 - -
11-librca - -
17 - -
17-graal - -
17-j9 - -
17-librca - -
21 - -
21-graal - -
21-librca - -
25 - -
25-graal - -
25-librca - -

Legend: ✅ passed | ❌ failed | ⚪ skipped | 🚫 cancelled

Summary: Total: 32 | Passed: 32 | Failed: 0


Updated: 2026-07-16 10:45:05 UTC

@dd-octo-sts

dd-octo-sts Bot commented Jul 8, 2026

Copy link
Copy Markdown
Contributor

Reliability & Chaos Results

All reliability & chaos checks passed Pipeline: https://gitlab.ddbuild.io/DataDog/java-profiler/-/pipelines/124973094

@datadog-datadog-prod-us1

This comment has been minimized.

@jbachorik jbachorik marked this pull request as ready for review July 9, 2026 09:04
@jbachorik jbachorik requested a review from a team as a code owner July 9, 2026 09:04

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: e1dd0fb1c7

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

@jbachorik jbachorik marked this pull request as draft July 9, 2026 13:58
@dd-octo-sts

dd-octo-sts Bot commented Jul 10, 2026

Copy link
Copy Markdown
Contributor

Benchmark Results (commit 3e379a7)

Pipeline: https://gitlab.ddbuild.io/DataDog/apm-reliability/benchmarking-platform/-/pipelines/123961967 Commit: 3e379a760b7320f2334eb3fbfafbedc8347c0e2f

✅ Within expected boundaries

No significant runtime deltas (all within run-to-run noise) and no internal-counter outliers.

Runtime details (per benchmark × JDK)
Benchmark JDK Latest Dev Δ (dev vs latest) Issues L/D
akka-uct 21 ✅ 10276 ms (21 iters) ✅ 10301 ms (21 iters) ≈ +0.2% (±11.2%) — / —
akka-uct 25 ✅ 8891 ms (24 iters) ✅ 8795 ms (24 iters) ≈ -1.1% (±10%) — / —
finagle-chirper 21 ✅ 5962 ms (33 iters) ✅ 6006 ms (33 iters) ≈ +0.7% (±25.6%) ⚠️ W:3 / ⚠️ W:3
finagle-chirper 25 ✅ 5428 ms (36 iters) ✅ 5434 ms (36 iters) ≈ +0.1% (±24.4%) ⚠️ W:3 / ⚠️ W:3
fj-kmeans 21 ✅ 2833 ms (66 iters) ✅ 2761 ms (68 iters) ≈ -2.5% (±2.6%) — / —
fj-kmeans 25 ✅ 2813 ms (66 iters) ✅ 2796 ms (66 iters) ≈ -0.6% (±2.6%) — / —
future-genetic 21 ✅ 2048 ms (90 iters) ✅ 2066 ms (90 iters) ≈ +0.9% (±2.6%) — / —
future-genetic 25 ✅ 2003 ms (92 iters) ✅ 2019 ms (92 iters) ≈ +0.8% (±2.8%) — / —
naive-bayes 21 ✅ 1291 ms (133 iters) ✅ 1323 ms (131 iters) ≈ +2.5% (±33.2%) — / —
naive-bayes 25 ✅ 1015 ms (168 iters) ✅ 1020 ms (168 iters) ≈ +0.5% (±31.9%) — / —
reactors 21 ✅ 16390 ms (15 iters) ✅ 16273 ms (15 iters) ≈ -0.7% (±7.4%) — / —
reactors 25 ✅ 18523 ms (15 iters) ✅ 18461 ms (15 iters) ≈ -0.3% (±4.5%) — / —
Internal counter details (ddprof)

ddprof internal counters, latest / dev (✅ = 0, · = unavailable):

Benchmark JDK Dropped rec Dropped jvmti Dropped trace Skipped WC AGCT fail Unwind fail
akka-uct 21 ✅ / ✅ ✅ / ✅ 2 / 3 2026 / 1886 ✅ / ✅ ✅ / ✅
akka-uct 25 ✅ / ✅ ✅ / ✅ 1 / 3 2286 / 2215 ✅ / ✅ ✅ / ✅
finagle-chirper 21 ✅ / ✅ ✅ / ✅ 1 / 1 8524 / 8931 ✅ / ✅ ✅ / ✅
finagle-chirper 25 ✅ / ✅ ✅ / ✅ ✅ / 1 8465 / 8838 ✅ / ✅ ✅ / ✅
fj-kmeans 21 ✅ / ✅ ✅ / ✅ 4 / 1 1249 / 1268 ✅ / ✅ ✅ / ✅
fj-kmeans 25 ✅ / ✅ ✅ / ✅ 3 / 4 1276 / 1265 ✅ / ✅ ✅ / ✅
future-genetic 21 ✅ / ✅ ✅ / ✅ 1 / 1 2967 / 3001 ✅ / ✅ ✅ / ✅
future-genetic 25 ✅ / ✅ ✅ / ✅ 1 / 2 2906 / 2864 ✅ / ✅ ✅ / ✅
naive-bayes 21 ✅ / ✅ ✅ / ✅ 3 / 3 3482 / 3544 ✅ / ✅ ✅ / ✅
naive-bayes 25 ✅ / ✅ ✅ / ✅ 4 / 2 3463 / 3508 ✅ / ✅ ✅ / ✅
reactors 21 ✅ / ✅ ✅ / ✅ ✅ / 1 1674 / 1652 ✅ / ✅ ✅ / ✅
reactors 25 ✅ / ✅ ✅ / ✅ ✅ / ✅ 1937 / 1857 ✅ / ✅ ✅ / ✅

@rkennke

rkennke commented Jul 10, 2026

Copy link
Copy Markdown
Contributor

Not a review, but one thing that I can't quickly see from looking at the code: does it trigger actual migrations of vthreads across carriers? Because that is the fault scenario that led to the heap corruption.

@jbachorik

Copy link
Copy Markdown
Collaborator Author

@rkennke It is trying to - but it is very probabilistic. It is trying to hold back carrier threads so new ones have to be spawned, then let the old one die so the vthread will have to be remounted but DBB still point to now invalid memory.
TBH, I haven't really got any invalid access, so the test might not be completely successful in doing that :/

@rkennke

rkennke commented Jul 10, 2026

Copy link
Copy Markdown
Contributor

J9 MALLOC_CHECK_ skip: stale ticket reference + open question

The comment justifying the J9 skip in ProfilerTestPlugin.kt contradicts this PR's own narrative, and it's the shipped comment (not just the description) that carries the problem:

// ... skip on J9 (its own allocator usage trips a pre-existing, unrelated heap
// corruption that needs separate investigation — see PROF-15360).

Two issues:

  1. Stale ticket reference. This cites PROF-15360 as an open "needs separate investigation" item, but the PR description says PROF-15360 is closed — and closed precisely because it wasn't heap corruption at all; the real root cause was the isRawPointer() debug-assert SIGABRT that this same PR fixes (PROF-15364). So the comment describes the fixed bug as an unrelated, still-open one.

  2. The stale justification is load-bearing. It's the stated reason for skipping MALLOC_CHECK_/MALLOC_PERTURB_ on J9 — a real behavioral decision. So this isn't cosmetic: it drives whether J9 test runs get heap-corruption checking at all.

That raises a substantive question: if the only known J9 problem was PROF-15360 and it's fixed here, is the J9 skip still needed? Either

  • there's a genuinely separate J9 heap issue → then point the comment at a real open ticket with an accurate description; or
  • there isn't → then the skip is suppressing MALLOC_CHECK_ coverage on exactly the VM where the recent trouble surfaced, and should probably be dropped so J9 gets the same checking as glibc/HotSpot.

Could you reconcile the comment and confirm which case applies before merge?

@rkennke

rkennke commented Jul 10, 2026

Copy link
Copy Markdown
Contributor

@rkennke It is trying to - but it is very probabilistic. It is trying to hold back carrier threads so new ones have to be spawned, then let the old one die so the vthread will have to be remounted but DBB still point to now invalid memory. TBH, I haven't really got any invalid access, so the test might not be completely successful in doing that :/

I see. If you have the time/nerve(/AI tokens) for it, you could perhaps try using a custom FJP where you can control the thread lifecycles. Probabilistic is fine, though, better than nothing.

@jbachorik

Copy link
Copy Markdown
Collaborator Author

@rkennke That's a great idea. Thanks!

@jbachorik jbachorik added the sphinx:critical Sphinx: critical — human review required label Jul 10, 2026
@dd-octo-sts

dd-octo-sts Bot commented Jul 13, 2026

Copy link
Copy Markdown
Contributor

Benchmark Results (commit b71ca62)

Pipeline: https://gitlab.ddbuild.io/DataDog/apm-reliability/benchmarking-platform/-/pipelines/124279353 Commit: b71ca62c0f1b8cd615144b00493c4e22891a4a6f

⚠️ Significant outliers

  • 🔴 fj-kmeans (JDK 25): runtime +3.6% (2737→2836 ms)
  • 🔴 future-genetic (JDK 25): runtime +4.9% (2041→2141 ms)
Runtime details (per benchmark × JDK)
Benchmark JDK Latest Dev Δ (dev vs latest) Issues L/D
akka-uct 21 ✅ 10191 ms (21 iters) ✅ 10399 ms (21 iters) ≈ +2% (±11.9%) — / —
akka-uct 25 ✅ 8940 ms (24 iters) ✅ 8819 ms (24 iters) ≈ -1.4% (±9.6%) — / —
finagle-chirper 21 ✅ 5958 ms (33 iters) ✅ 5999 ms (33 iters) ≈ +0.7% (±24.8%) ⚠️ W:3 / ⚠️ W:4
finagle-chirper 25 ✅ 5524 ms (36 iters) ✅ 5491 ms (36 iters) ≈ -0.6% (±25%) ⚠️ W:3 / ⚠️ W:3
fj-kmeans 21 ✅ 2746 ms (68 iters) ✅ 2742 ms (68 iters) ≈ -0.1% (±2.7%) — / —
fj-kmeans 25 ✅ 2737 ms (69 iters) ✅ 2836 ms (66 iters) 🔴 +3.6% — / —
future-genetic 21 ✅ 2083 ms (89 iters) ✅ 2065 ms (90 iters) ≈ -0.9% (±2.6%) — / —
future-genetic 25 ✅ 2041 ms (90 iters) ✅ 2141 ms (87 iters) 🔴 +4.9% — / —
naive-bayes 21 ✅ 1291 ms (133 iters) ✅ 1255 ms (136 iters) ≈ -2.8% (±31.7%) — / —
naive-bayes 25 ✅ 983 ms (174 iters) ✅ 999 ms (171 iters) ≈ +1.6% (±31.9%) — / —
reactors 21 ✅ 16505 ms (15 iters) ✅ 16271 ms (15 iters) ≈ -1.4% (±8.3%) — / —
reactors 25 ✅ 18606 ms (14 iters) ✅ 18677 ms (15 iters) ≈ +0.4% (±5.6%) — / —
Internal counter details (ddprof)

ddprof internal counters, latest / dev (✅ = 0, · = unavailable):

Benchmark JDK Dropped rec Dropped jvmti Dropped trace Skipped WC AGCT fail Unwind fail
akka-uct 21 ✅ / ✅ ✅ / ✅ 2 / 1 2094 / 2059 ✅ / ✅ ✅ / ✅
akka-uct 25 ✅ / ✅ ✅ / ✅ ✅ / 5 2307 / 2237 ✅ / ✅ ✅ / ✅
finagle-chirper 21 ✅ / ✅ ✅ / ✅ 6 / 2 8584 / 8425 ✅ / ✅ ✅ / ✅
finagle-chirper 25 ✅ / ✅ ✅ / ✅ 3 / 2 8769 / 8940 ✅ / ✅ ✅ / ✅
fj-kmeans 21 ✅ / ✅ ✅ / ✅ 1 / 1 1252 / 1221 ✅ / ✅ ✅ / ✅
fj-kmeans 25 ✅ / ✅ ✅ / ✅ 1 / 1 1320 / 1251 ✅ / ✅ ✅ / ✅
future-genetic 21 ✅ / ✅ ✅ / ✅ 1 / 4 2917 / 2984 ✅ / ✅ ✅ / ✅
future-genetic 25 ✅ / ✅ ✅ / ✅ 1 / 3 2900 / 2964 ✅ / ✅ ✅ / ✅
naive-bayes 21 ✅ / ✅ ✅ / ✅ ✅ / 2 3507 / 3542 ✅ / ✅ ✅ / ✅
naive-bayes 25 ✅ / ✅ ✅ / ✅ 8 / 2 3509 / 3455 ✅ / ✅ ✅ / ✅
reactors 21 ✅ / ✅ ✅ / ✅ ✅ / 2 1682 / 1599 ✅ / ✅ ✅ / ✅
reactors 25 ✅ / ✅ ✅ / ✅ 1 / ✅ 1520 / 1920 ✅ / ✅ ✅ / ✅

@jbachorik jbachorik marked this pull request as ready for review July 13, 2026 11:33

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: b71ca62c0f

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread utils/run-chaos-harness.sh Outdated
Comment thread utils/run-chaos-harness.sh Outdated
@jbachorik

jbachorik commented Jul 13, 2026

Copy link
Copy Markdown
Collaborator Author

Two issues:

  1. Stale ticket reference. This cites PROF-15360 as an open "needs separate investigation" item, but the PR description says PROF-15360 is closed — and closed precisely because it wasn't heap corruption at all; the real root cause was the isRawPointer() debug-assert SIGABRT that this same PR fixes (PROF-15364). So the comment describes the fixed bug as an unrelated, still-open one.

  2. The stale justification is load-bearing. It's the stated reason for skipping MALLOC_CHECK_/MALLOC_PERTURB_ on J9 — a real behavioral decision. So this isn't cosmetic: it drives whether J9 test runs get heap-corruption checking at all.

That raises a substantive question: if the only known J9 problem was PROF-15360 and it's fixed here, is the J9 skip still needed? Either

  • there's a genuinely separate J9 heap issue → then point the comment at a real open ticket with an accurate description; or
  • there isn't → then the skip is suppressing MALLOC_CHECK_ coverage on exactly the VM where the recent trouble surfaced, and should probably be dropped so J9 gets the same checking as glibc/HotSpot.

Could you reconcile the comment and confirm which case applies before merge?

Confirmed case 2. Traced the skip's history: the commit that added it (0b03bba2f) says its sole justification is "a pre-existing, unrelated glibc heap-corruption bug" - that's exactly PROF-15360, which is closed as invalid in favor of PROF-15364 (the isRawPointer() fix in this PR). There's no other ticket or commit citing a genuinely separate J9 issue. Dropped the skip in 1d054ccc3 - J9 now gets the same MALLOC_CHECK_/MALLOC_PERTURB_ coverage as glibc/HotSpot>.

@dd-octo-sts

dd-octo-sts Bot commented Jul 13, 2026

Copy link
Copy Markdown
Contributor

Benchmark Results (commit 1d054cc)

Pipeline: https://gitlab.ddbuild.io/DataDog/apm-reliability/benchmarking-platform/-/pipelines/124288733 Commit: 1d054ccc317f51be35cf69bb21ea03845ef08b11

⚠️ Significant outliers

  • 🔴 future-genetic (JDK 21): runtime +8.6% (2042→2218 ms)
  • 🟢 future-genetic (JDK 25): runtime -4.2% (2098→2010 ms)
Runtime details (per benchmark × JDK)
Benchmark JDK Latest Dev Δ (dev vs latest) Issues L/D
akka-uct 21 ✅ 10249 ms (21 iters) ✅ 10378 ms (21 iters) ≈ +1.3% (±10.7%) — / —
akka-uct 25 ✅ 8766 ms (24 iters) ✅ 8849 ms (24 iters) ≈ +0.9% (±10.2%) — / —
finagle-chirper 21 ✅ 5973 ms (33 iters) ✅ 5999 ms (33 iters) ≈ +0.4% (±25.1%) ⚠️ W:3 / ⚠️ W:4
finagle-chirper 25 ✅ 5498 ms (36 iters) ✅ 5448 ms (36 iters) ≈ -0.9% (±24.6%) ⚠️ W:3 / ⚠️ W:3
fj-kmeans 21 ✅ 2740 ms (68 iters) ✅ 2777 ms (67 iters) ≈ +1.4% (±2.7%) — / —
fj-kmeans 25 ✅ 2813 ms (66 iters) ✅ 2802 ms (66 iters) ≈ -0.4% (±2.6%) — / —
future-genetic 21 ✅ 2042 ms (90 iters) ✅ 2218 ms (84 iters) 🔴 +8.6% — / —
future-genetic 25 ✅ 2098 ms (88 iters) ✅ 2010 ms (93 iters) 🟢 -4.2% — / —
naive-bayes 21 ✅ 1269 ms (135 iters) ✅ 1279 ms (134 iters) ≈ +0.8% (±32.9%) — / —
naive-bayes 25 ✅ 1012 ms (169 iters) ✅ 1007 ms (170 iters) ≈ -0.5% (±31.3%) — / —
reactors 25 ✅ 18623 ms (15 iters) ✅ 18109 ms (15 iters) ≈ -2.8% (±5.7%) — / —
Internal counter details (ddprof)

ddprof internal counters, latest / dev (✅ = 0, · = unavailable):

Benchmark JDK Dropped rec Dropped jvmti Dropped trace Skipped WC AGCT fail Unwind fail
akka-uct 21 ✅ / ✅ ✅ / ✅ 2 / 1 2035 / 2016 ✅ / ✅ ✅ / ✅
akka-uct 25 ✅ / ✅ ✅ / ✅ 1 / 3 2000 / 2280 ✅ / ✅ ✅ / ✅
finagle-chirper 21 ✅ / ✅ ✅ / ✅ 4 / 1 8876 / 8515 ✅ / ✅ ✅ / ✅
finagle-chirper 25 ✅ / ✅ ✅ / ✅ 1 / 1 8312 / 8747 ✅ / ✅ ✅ / ✅
fj-kmeans 21 ✅ / ✅ ✅ / ✅ 3 / 1 1277 / 1255 ✅ / ✅ ✅ / ✅
fj-kmeans 25 ✅ / ✅ ✅ / ✅ 2 / 3 1287 / 1258 ✅ / ✅ ✅ / ✅
future-genetic 21 ✅ / ✅ ✅ / ✅ 2 / 1 2993 / 3089 ✅ / ✅ ✅ / ✅
future-genetic 25 ✅ / ✅ ✅ / ✅ 2 / 1 2898 / 2898 ✅ / ✅ ✅ / ✅
naive-bayes 21 ✅ / ✅ ✅ / ✅ 5 / 6 3554 / 3472 ✅ / ✅ ✅ / ✅
naive-bayes 25 ✅ / ✅ ✅ / ✅ 1 / 2 3475 / 3493 ✅ / ✅ ✅ / ✅
reactors 25 ✅ / ✅ ✅ / ✅ ✅ / 1 1903 / 1926 ✅ / ✅ ✅ / ✅

@dd-octo-sts

dd-octo-sts Bot commented Jul 13, 2026

Copy link
Copy Markdown
Contributor

Benchmark Results (commit fb6a1e8)

Pipeline: https://gitlab.ddbuild.io/DataDog/apm-reliability/benchmarking-platform/-/pipelines/124310879 Commit: fb6a1e880026b40b884b1ae2cec5843d5b04f044

⚠️ Significant outliers

  • 🔴 fj-kmeans (JDK 21): runtime +4.1% (2651→2759 ms)
  • 🔴 future-genetic (JDK 21): runtime +4.7% (2038→2134 ms)
Runtime details (per benchmark × JDK)
Benchmark JDK Latest Dev Δ (dev vs latest) Issues L/D
akka-uct 21 ✅ 10197 ms (21 iters) ✅ 10305 ms (21 iters) ≈ +1.1% (±11.5%) — / —
akka-uct 25 ✅ 8925 ms (24 iters) ✅ 8774 ms (24 iters) ≈ -1.7% (±10.1%) — / —
finagle-chirper 21 ✅ 5925 ms (33 iters) ✅ 5973 ms (33 iters) ≈ +0.8% (±25.2%) ⚠️ W:3 / ⚠️ W:4
finagle-chirper 25 ✅ 5436 ms (36 iters) ✅ 5402 ms (36 iters) ≈ -0.6% (±23.7%) ⚠️ W:3 / ⚠️ W:3
fj-kmeans 21 ✅ 2651 ms (71 iters) ✅ 2759 ms (68 iters) 🔴 +4.1% — / —
fj-kmeans 25 ✅ 2837 ms (66 iters) ✅ 2843 ms (66 iters) ≈ +0.2% (±2.6%) — / —
future-genetic 21 ✅ 2038 ms (91 iters) ✅ 2134 ms (87 iters) 🔴 +4.7% — / —
future-genetic 25 ✅ 2085 ms (89 iters) ✅ 2107 ms (88 iters) ≈ +1.1% (±2.5%) — / —
naive-bayes 21 ✅ 1234 ms (138 iters) ✅ 1249 ms (136 iters) ≈ +1.2% (±32.6%) — / —
naive-bayes 25 ✅ 1016 ms (169 iters) ✅ 1023 ms (167 iters) ≈ +0.7% (±31.6%) — / —
reactors 21 ✅ 16230 ms (15 iters) ✅ 16350 ms (15 iters) ≈ +0.7% (±8.4%) — / —
reactors 25 ✅ 18749 ms (15 iters) ✅ 18774 ms (15 iters) ≈ +0.1% (±5%) — / —
Internal counter details (ddprof)

ddprof internal counters, latest / dev (✅ = 0, · = unavailable):

Benchmark JDK Dropped rec Dropped jvmti Dropped trace Skipped WC AGCT fail Unwind fail
akka-uct 21 ✅ / ✅ ✅ / ✅ 1 / 2 2022 / 1981 ✅ / ✅ ✅ / ✅
akka-uct 25 ✅ / ✅ ✅ / ✅ 2 / 3 2389 / 2312 ✅ / ✅ ✅ / ✅
finagle-chirper 21 ✅ / ✅ ✅ / ✅ 4 / 2 8854 / 8395 ✅ / ✅ ✅ / ✅
finagle-chirper 25 ✅ / ✅ ✅ / ✅ ✅ / 1 8242 / 8401 ✅ / ✅ ✅ / ✅
fj-kmeans 21 ✅ / ✅ ✅ / ✅ 2 / 8 1286 / 1277 ✅ / ✅ ✅ / ✅
fj-kmeans 25 ✅ / ✅ ✅ / ✅ 4 / 3 1293 / 1264 ✅ / ✅ ✅ / ✅
future-genetic 21 ✅ / ✅ ✅ / ✅ 1 / 1 2929 / 2992 ✅ / ✅ ✅ / ✅
future-genetic 25 ✅ / ✅ ✅ / ✅ 4 / 2 2895 / 2906 ✅ / ✅ ✅ / ✅
naive-bayes 21 ✅ / ✅ ✅ / ✅ 2 / 2 3507 / 3474 ✅ / ✅ ✅ / ✅
naive-bayes 25 ✅ / ✅ ✅ / ✅ 3 / 3 3485 / 3437 ✅ / ✅ ✅ / ✅
reactors 21 ✅ / ✅ ✅ / ✅ ✅ / ✅ ✅ / ✅ ✅ / ✅ ✅ / ✅
reactors 25 ✅ / ✅ ✅ / ✅ ✅ / ✅ 1966 / 1937 ✅ / ✅ ✅ / ✅

@jbachorik

Copy link
Copy Markdown
Collaborator Author

Root-caused the reliability crashes reported in hs_err_1.log: bisecting the chaos-harness antagonists down to vthread-context-cascade alone reproduces the heap corruption every time (native-memory-tracking footer-canary abort in os::free(), downstream of a JvmtiThreadState free during VTMS_vthread_end).

Confirmed the crash requires the ddprof agent (the same antagonist run with no -javaagent completes cleanly), then traced it to OtelContextStorage's ContextStorageMode.THREAD fallback — the exact use-after-free the class's own javadoc (and vthread-context-cascade's javadoc) already documents: without carrier-scoped storage, a virtual thread's context buffer stays pinned to whichever carrier was mounted at first write; once that carrier's native ProfiledThread is freed on thread exit, a later write from a migrated virtual thread lands in freed memory and corrupts the heap. The [WARN] ddprof: carrier-scoped OTEL context storage is unavailable... line is present in the crashed run's log, confirming THREAD mode was active.

The harness was never passing --add-exports java.base/jdk.internal.misc=ALL-UNNAMED, so CARRIER mode (the actual fix, already shipped) never activated in reliability testing. Added the export flag in utils/run-chaos-harness.sh; re-ran the isolated antagonist for 90s afterward — no WARN, CARRIER mode active, completes cleanly (RC=0).

Worth calling out: vthread-context-cascade did exactly what it was designed for — it caught the memory-safety issue its own doc comments predicted for the THREAD fallback. Production is unaffected (dd-trace-java already grants this export at runtime); this was purely a reliability-harness gap.

@jbachorik

Copy link
Copy Markdown
Collaborator Author

@copilot resolve the merge conflicts in this pull request

@dd-octo-sts

dd-octo-sts Bot commented Jul 13, 2026

Copy link
Copy Markdown
Contributor

Benchmark Results (commit c7bf65c)

Pipeline: https://gitlab.ddbuild.io/DataDog/apm-reliability/benchmarking-platform/-/pipelines/124374293 Commit: c7bf65c5bc446ef76ff942a1bf20165266ea9c68

⚠️ Significant outliers

  • 🟢 future-genetic (JDK 25): runtime -6.9% (2091→1947 ms)
  • 🟢 reactors (JDK 21): runtime -7.1% (16789→15597 ms)
Runtime details (per benchmark × JDK)
Benchmark JDK Latest Dev Δ (dev vs latest) Issues L/D
akka-uct 21 ✅ 10216 ms (21 iters) ✅ 10186 ms (21 iters) ≈ -0.3% (±11.2%) — / —
akka-uct 25 ✅ 8851 ms (24 iters) ✅ 8864 ms (24 iters) ≈ +0.1% (±9.9%) — / —
finagle-chirper 21 ✅ 6035 ms (33 iters) ✅ 5965 ms (33 iters) ≈ -1.2% (±24.8%) ⚠️ W:3 / ⚠️ W:3
finagle-chirper 25 ✅ 5451 ms (36 iters) ✅ 5420 ms (36 iters) ≈ -0.6% (±24.3%) ⚠️ W:3 / ⚠️ W:3
fj-kmeans 21 ✅ 2791 ms (67 iters) ✅ 2784 ms (67 iters) ≈ -0.3% (±2.7%) — / —
fj-kmeans 25 ✅ 2835 ms (66 iters) ✅ 2822 ms (66 iters) ≈ -0.5% (±2.6%) — / —
future-genetic 21 ✅ 2112 ms (88 iters) ✅ 2119 ms (88 iters) ≈ +0.3% (±2.7%) — / —
future-genetic 25 ✅ 2091 ms (89 iters) ✅ 1947 ms (95 iters) 🟢 -6.9% — / —
naive-bayes 21 ✅ 1325 ms (129 iters) ✅ 1239 ms (137 iters) ≈ -6.5% (±31.7%) — / —
naive-bayes 25 ✅ 1023 ms (167 iters) ✅ 1005 ms (170 iters) ≈ -1.8% (±31.4%) — / —
reactors 21 ✅ 16789 ms (15 iters) ✅ 15597 ms (16 iters) 🟢 -7.1% — / —
reactors 25 ✅ 18388 ms (15 iters) ✅ 19200 ms (14 iters) ≈ +4.4% (±4.7%) — / —
Internal counter details (ddprof)

ddprof internal counters, latest / dev (✅ = 0, · = unavailable):

Benchmark JDK Dropped rec Dropped jvmti Dropped trace Skipped WC AGCT fail Unwind fail
akka-uct 21 ✅ / ✅ ✅ / ✅ 1 / 1 2004 / 1877 ✅ / ✅ ✅ / ✅
akka-uct 25 ✅ / ✅ ✅ / ✅ 2 / 6 2212 / 2130 ✅ / ✅ ✅ / ✅
finagle-chirper 21 ✅ / ✅ ✅ / ✅ 2 / 4 9142 / 8336 ✅ / ✅ ✅ / ✅
finagle-chirper 25 ✅ / ✅ ✅ / ✅ 1 / 1 8043 / 8491 ✅ / ✅ ✅ / ✅
fj-kmeans 21 ✅ / ✅ ✅ / ✅ 2 / 1 1278 / 1245 ✅ / ✅ ✅ / ✅
fj-kmeans 25 ✅ / ✅ ✅ / ✅ 2 / 3 1289 / 1272 ✅ / ✅ ✅ / ✅
future-genetic 21 ✅ / ✅ ✅ / ✅ ✅ / 1 2963 / 2969 ✅ / ✅ ✅ / ✅
future-genetic 25 ✅ / ✅ ✅ / ✅ 1 / 1 2990 / 2839 ✅ / ✅ ✅ / ✅
naive-bayes 21 ✅ / ✅ ✅ / ✅ 3 / 2 3537 / 3505 ✅ / ✅ ✅ / ✅
naive-bayes 25 ✅ / ✅ ✅ / ✅ 6 / 3 3488 / 3463 ✅ / ✅ ✅ / ✅
reactors 21 ✅ / ✅ ✅ / ✅ 2 / 1 1779 / 1596 ✅ / ✅ ✅ / ✅
reactors 25 ✅ / ✅ ✅ / ✅ 1 / ✅ 1851 / 2013 ✅ / ✅ ✅ / ✅

Copilot AI commented Jul 13, 2026

Copy link
Copy Markdown
Contributor

@copilot resolve the merge conflicts in this pull request

Resolved by merging origin/main into this branch in 2e345070. I kept .gitlab/reliability/chaos_check.sh as the wrapper and carried main's latest tcmalloc reliability tuning into utils/run-chaos-harness.sh.

@dd-octo-sts

dd-octo-sts Bot commented Jul 13, 2026

Copy link
Copy Markdown
Contributor

Benchmark Results (commit 2e34507)

Pipeline: https://gitlab.ddbuild.io/DataDog/apm-reliability/benchmarking-platform/-/pipelines/124382794 Commit: 2e345070e9dc0feac469eba7b64d281b904434a2

✅ Within expected boundaries

No significant runtime deltas (all within run-to-run noise) and no internal-counter outliers.

Runtime details (per benchmark × JDK)
Benchmark JDK Latest Dev Δ (dev vs latest) Issues L/D
akka-uct 21 ✅ 10332 ms (21 iters) ✅ 10253 ms (21 iters) ≈ -0.8% (±11.2%) — / —
akka-uct 25 ✅ 8888 ms (24 iters) ✅ 8875 ms (24 iters) ≈ -0.1% (±10.5%) — / —
finagle-chirper 21 ✅ 5967 ms (33 iters) ✅ 6034 ms (33 iters) ≈ +1.1% (±25.5%) ⚠️ W:3 / ⚠️ W:3
finagle-chirper 25 ✅ 5496 ms (36 iters) ✅ 5484 ms (36 iters) ≈ -0.2% (±24.4%) ⚠️ W:4 / ⚠️ W:3
fj-kmeans 21 ✅ 2715 ms (69 iters) ✅ 2763 ms (68 iters) ≈ +1.8% (±2.8%) — / —
fj-kmeans 25 ✅ 2805 ms (66 iters) ✅ 2806 ms (66 iters) ≈ +0% (±2.6%) — / —
future-genetic 21 ✅ 2124 ms (87 iters) ✅ 2076 ms (90 iters) ≈ -2.3% (±2.7%) — / —
future-genetic 25 ✅ 2071 ms (90 iters) ✅ 2038 ms (91 iters) ≈ -1.6% (±2.6%) — / —
naive-bayes 21 ✅ 1249 ms (137 iters) ✅ 1281 ms (133 iters) ≈ +2.6% (±33.2%) — / —
naive-bayes 25 ✅ 1007 ms (170 iters) ✅ 1012 ms (169 iters) ≈ +0.5% (±31.5%) — / —
reactors 21 ✅ 16798 ms (15 iters) ✅ 16249 ms (15 iters) ≈ -3.3% (±7.4%) — / —
reactors 25 ✅ 18514 ms (15 iters) ✅ 18552 ms (15 iters) ≈ +0.2% (±4.8%) — / —
Internal counter details (ddprof)

ddprof internal counters, latest / dev (✅ = 0, · = unavailable):

Benchmark JDK Dropped rec Dropped jvmti Dropped trace Skipped WC AGCT fail Unwind fail
akka-uct 21 ✅ / ✅ ✅ / ✅ 3 / 4 2107 / 1965 ✅ / ✅ ✅ / ✅
akka-uct 25 ✅ / ✅ ✅ / ✅ 2 / 1 2239 / 2229 ✅ / ✅ ✅ / ✅
finagle-chirper 21 ✅ / ✅ ✅ / ✅ 2 / 3 8336 / 8684 ✅ / ✅ ✅ / ✅
finagle-chirper 25 ✅ / ✅ ✅ / ✅ 2 / 1 8033 / 8536 ✅ / ✅ ✅ / ✅
fj-kmeans 21 ✅ / ✅ ✅ / ✅ 3 / 3 1292 / 1276 ✅ / ✅ ✅ / ✅
fj-kmeans 25 ✅ / ✅ ✅ / ✅ 3 / 2 1269 / 1275 ✅ / ✅ ✅ / ✅
future-genetic 21 ✅ / ✅ ✅ / ✅ 1 / 2 2918 / 3005 ✅ / ✅ ✅ / ✅
future-genetic 25 ✅ / ✅ ✅ / ✅ 3 / 1 2959 / 2821 ✅ / ✅ ✅ / ✅
naive-bayes 21 ✅ / ✅ ✅ / ✅ 5 / 2 3530 / 3484 ✅ / ✅ ✅ / ✅
naive-bayes 25 ✅ / ✅ ✅ / ✅ 4 / 3 3507 / 3519 ✅ / ✅ ✅ / ✅
reactors 21 ✅ / ✅ ✅ / ✅ 2 / 1 1647 / 1677 ✅ / ✅ ✅ / ✅
reactors 25 ✅ / ✅ ✅ / ✅ 1 / 1 1947 / 2027 ✅ / ✅ ✅ / ✅

@dd-octo-sts

dd-octo-sts Bot commented Jul 14, 2026

Copy link
Copy Markdown
Contributor

Benchmark Results (commit cfe1245)

Pipeline: https://gitlab.ddbuild.io/DataDog/apm-reliability/benchmarking-platform/-/pipelines/124478924 Commit: cfe1245bb6b73c6a061e383c66afaeb53dc77870

✅ Within expected boundaries

No significant runtime deltas (all within run-to-run noise) and no internal-counter outliers.

Runtime details (per benchmark × JDK)
Benchmark JDK Latest Dev Δ (dev vs latest) Issues L/D
finagle-chirper 21 ✅ 6028 ms (33 iters) ✅ 5991 ms (33 iters) ≈ -0.6% (±25.4%) ⚠️ W:3 / ⚠️ W:3
finagle-chirper 25 ✅ 5522 ms (36 iters) ✅ 5437 ms (36 iters) ≈ -1.5% (±23.8%) ⚠️ W:3 / ⚠️ W:3
fj-kmeans 25 ✅ 2844 ms (66 iters) ✅ 2838 ms (66 iters) ≈ -0.2% (±2.6%) — / —
future-genetic 21 ✅ 2074 ms (90 iters) ✅ 2071 ms (90 iters) ≈ -0.1% (±2.6%) — / —
naive-bayes 21 ✅ 1251 ms (137 iters) ✅ 1325 ms (130 iters) ≈ +5.9% (±33.3%) — / —
naive-bayes 25 ✅ 1019 ms (168 iters) ✅ 1006 ms (170 iters) ≈ -1.3% (±31.3%) — / —
reactors 21 ✅ 16573 ms (15 iters) ✅ 16543 ms (15 iters) ≈ -0.2% (±6.9%) — / —
reactors 25 ✅ 18519 ms (15 iters) ✅ 18476 ms (15 iters) ≈ -0.2% (±4.4%) — / —
Internal counter details (ddprof)

ddprof internal counters, latest / dev (✅ = 0, · = unavailable):

Benchmark JDK Dropped rec Dropped jvmti Dropped trace Skipped WC AGCT fail Unwind fail
akka-uct 21 ✅ / ✅ ✅ / ✅ ✅ / ✅ ✅ / ✅ ✅ / ✅ ✅ / ✅
akka-uct 25 ✅ / ✅ ✅ / ✅ 2 / ✅ 2116 / 2277 ✅ / ✅ ✅ / ✅
finagle-chirper 21 ✅ / ✅ ✅ / ✅ ✅ / ✅ ✅ / ✅ ✅ / ✅ ✅ / ✅
finagle-chirper 25 ✅ / ✅ ✅ / ✅ ✅ / 1 8408 / 8363 ✅ / ✅ ✅ / ✅
fj-kmeans 21 ✅ / ✅ ✅ / ✅ ✅ / ✅ ✅ / ✅ ✅ / ✅ ✅ / ✅
fj-kmeans 25 ✅ / ✅ ✅ / ✅ ✅ / 4 1287 / 1280 ✅ / ✅ ✅ / ✅
future-genetic 21 ✅ / ✅ ✅ / ✅ 1 / 2 3033 / 3027 ✅ / ✅ ✅ / ✅
future-genetic 25 ✅ / ✅ ✅ / ✅ 1 / ✅ 2824 / 2968 ✅ / ✅ ✅ / ✅
naive-bayes 21 ✅ / ✅ ✅ / ✅ 4 / 4 3511 / 3525 ✅ / ✅ ✅ / ✅
naive-bayes 25 ✅ / ✅ ✅ / ✅ 1 / 6 3483 / 3481 ✅ / ✅ ✅ / ✅
reactors 21 ✅ / ✅ ✅ / ✅ ✅ / 2 1602 / 1607 ✅ / ✅ ✅ / ✅
reactors 25 ✅ / ✅ ✅ / ✅ ✅ / 1 1888 / 1820 ✅ / ✅ ✅ / ✅

@dd-octo-sts

dd-octo-sts Bot commented Jul 14, 2026

Copy link
Copy Markdown
Contributor

Benchmark Results (commit 33a8f3d)

Pipeline: https://gitlab.ddbuild.io/DataDog/apm-reliability/benchmarking-platform/-/pipelines/124498331 Commit: 33a8f3deb506fe0186f1608bfd573b71663a7d11

⚠️ Significant outliers

  • 🔴 fj-kmeans (JDK 21): runtime +3.2% (2702→2788 ms)
  • 🟢 future-genetic (JDK 21): runtime -2.8% (2153→2092 ms)
Runtime details (per benchmark × JDK)
Benchmark JDK Latest Dev Δ (dev vs latest) Issues L/D
akka-uct 21 ✅ 10359 ms (21 iters) ✅ 10432 ms (21 iters) ≈ +0.7% (±11%) — / —
akka-uct 25 ✅ 8965 ms (24 iters) ✅ 8729 ms (24 iters) ≈ -2.6% (±10.8%) — / —
finagle-chirper 21 ✅ 6009 ms (33 iters) ✅ 6032 ms (33 iters) ≈ +0.4% (±25.1%) ⚠️ W:3 / ⚠️ W:3
finagle-chirper 25 ✅ 5446 ms (36 iters) ✅ 5464 ms (36 iters) ≈ +0.3% (±24.1%) ⚠️ W:3 / ⚠️ W:3
fj-kmeans 21 ✅ 2702 ms (69 iters) ✅ 2788 ms (67 iters) 🔴 +3.2% — / —
fj-kmeans 25 ✅ 2748 ms (68 iters) ✅ 2757 ms (67 iters) ≈ +0.3% (±2.8%) — / —
future-genetic 21 ✅ 2153 ms (86 iters) ✅ 2092 ms (89 iters) 🟢 -2.8% — / —
future-genetic 25 ✅ 2057 ms (91 iters) ✅ 2038 ms (91 iters) ≈ -0.9% (±2.7%) — / —
naive-bayes 21 ✅ 1257 ms (136 iters) ✅ 1280 ms (134 iters) ≈ +1.8% (±32.7%) — / —
naive-bayes 25 ✅ 1026 ms (167 iters) ✅ 982 ms (173 iters) ≈ -4.3% (±30.9%) — / —
reactors 21 ✅ 17155 ms (15 iters) ✅ 16050 ms (15 iters) ≈ -6.4% (±7.4%) — / —
reactors 25 ✅ 18361 ms (15 iters) ✅ 18840 ms (15 iters) ≈ +2.6% (±3.7%) — / —
Internal counter details (ddprof)

ddprof internal counters, latest / dev (✅ = 0, · = unavailable):

Benchmark JDK Dropped rec Dropped jvmti Dropped trace Skipped WC AGCT fail Unwind fail
akka-uct 21 ✅ / ✅ ✅ / ✅ 1 / 1 2050 / 1918 ✅ / ✅ ✅ / ✅
akka-uct 25 ✅ / ✅ ✅ / ✅ 4 / 4 2273 / 2115 ✅ / ✅ ✅ / ✅
finagle-chirper 21 ✅ / ✅ ✅ / ✅ 3 / 3 8651 / 8737 ✅ / ✅ ✅ / ✅
finagle-chirper 25 ✅ / ✅ ✅ / ✅ ✅ / ✅ 8617 / 8305 ✅ / ✅ ✅ / ✅
fj-kmeans 21 ✅ / ✅ ✅ / ✅ 1 / 4 1262 / 1289 ✅ / ✅ ✅ / ✅
fj-kmeans 25 ✅ / ✅ ✅ / ✅ 2 / 2 1279 / 1244 ✅ / ✅ ✅ / ✅
future-genetic 21 ✅ / ✅ ✅ / ✅ ✅ / 1 2954 / 3068 ✅ / ✅ ✅ / ✅
future-genetic 25 ✅ / ✅ ✅ / ✅ ✅ / ✅ 2901 / 2857 ✅ / ✅ ✅ / ✅
naive-bayes 21 ✅ / ✅ ✅ / ✅ 4 / 2 3474 / 3522 ✅ / ✅ ✅ / ✅
naive-bayes 25 ✅ / ✅ ✅ / ✅ 7 / 3 3505 / 3513 ✅ / ✅ ✅ / ✅
reactors 21 ✅ / ✅ ✅ / ✅ 3 / 1 1780 / 1682 ✅ / ✅ ✅ / ✅
reactors 25 ✅ / ✅ ✅ / ✅ 1 / 1 1893 / 1910 ✅ / ✅ ✅ / ✅

@jbachorik

Copy link
Copy Markdown
Collaborator Author

@copilot resolve the merge conflicts in this pull request

Copilot AI commented Jul 14, 2026

Copy link
Copy Markdown
Contributor

@copilot resolve the merge conflicts in this pull request

Resolved by merging origin/main in 37276d36, then keeping the merged FrameType::isRawPointer() guards/tests tidy in 8254e49a.

@dd-octo-sts

dd-octo-sts Bot commented Jul 14, 2026

Copy link
Copy Markdown
Contributor

Benchmark Results (commit 17d0792)

Pipeline: https://gitlab.ddbuild.io/DataDog/apm-reliability/benchmarking-platform/-/pipelines/124513178 Commit: 17d079201ba1c358fed9ff90884f90c7cc093cc5

⚠️ Significant outliers

  • 🟢 fj-kmeans (JDK 21): runtime -4.5% (2780→2656 ms)
  • 🔴 future-genetic (JDK 21): runtime +4.7% (2067→2164 ms)
Runtime details (per benchmark × JDK)
Benchmark JDK Latest Dev Δ (dev vs latest) Issues L/D
akka-uct 21 ✅ 10378 ms (21 iters) ✅ 10302 ms (21 iters) ≈ -0.7% (±11.7%) — / —
akka-uct 25 ✅ 8861 ms (24 iters) ✅ 8870 ms (24 iters) ≈ +0.1% (±9.7%) — / —
finagle-chirper 21 ✅ 6046 ms (33 iters) ✅ 6109 ms (33 iters) ≈ +1% (±25.7%) ⚠️ W:3 / ⚠️ W:4
finagle-chirper 25 ✅ 5515 ms (36 iters) ✅ 5589 ms (35 iters) ≈ +1.3% (±25.3%) ⚠️ W:3 / ⚠️ W:3
fj-kmeans 21 ✅ 2780 ms (67 iters) ✅ 2656 ms (70 iters) 🟢 -4.5% — / —
fj-kmeans 25 ✅ 2831 ms (66 iters) ✅ 2820 ms (66 iters) ≈ -0.4% (±2.6%) — / —
future-genetic 21 ✅ 2067 ms (89 iters) ✅ 2164 ms (86 iters) 🔴 +4.7% — / —
naive-bayes 21 ✅ 1283 ms (133 iters) ✅ 1289 ms (133 iters) ≈ +0.5% (±33.1%) — / —
naive-bayes 25 ✅ 968 ms (175 iters) ✅ 1008 ms (170 iters) ≈ +4.1% (±32.5%) — / —
reactors 21 ✅ 15934 ms (15 iters) ✅ 16648 ms (15 iters) ≈ +4.5% (±8.1%) — / —
reactors 25 ✅ 18828 ms (15 iters) ✅ 18359 ms (15 iters) ≈ -2.5% (±4.8%) — / —
Internal counter details (ddprof)

ddprof internal counters, latest / dev (✅ = 0, · = unavailable):

Benchmark JDK Dropped rec Dropped jvmti Dropped trace Skipped WC AGCT fail Unwind fail
akka-uct 21 ✅ / ✅ ✅ / ✅ 3 / 2 2003 / 2011 ✅ / ✅ ✅ / ✅
akka-uct 25 ✅ / ✅ ✅ / ✅ 2 / 1 2162 / 2344 ✅ / ✅ ✅ / ✅
finagle-chirper 21 ✅ / ✅ ✅ / ✅ 2 / 2 8597 / 8674 ✅ / ✅ ✅ / ✅
finagle-chirper 25 ✅ / ✅ ✅ / ✅ 2 / 1 8651 / 8404 ✅ / ✅ ✅ / ✅
fj-kmeans 21 ✅ / ✅ ✅ / ✅ 4 / ✅ 1284 / 1291 ✅ / ✅ ✅ / ✅
fj-kmeans 25 ✅ / ✅ ✅ / ✅ ✅ / ✅ 1283 / 1277 ✅ / ✅ ✅ / ✅
future-genetic 21 ✅ / ✅ ✅ / ✅ ✅ / 1 2971 / 3043 ✅ / ✅ ✅ / ✅
future-genetic 25 ✅ / ✅ ✅ / ✅ 2 / 2 2874 / 2900 ✅ / ✅ ✅ / ✅
naive-bayes 21 ✅ / ✅ ✅ / ✅ 3 / 2 3512 / 3521 ✅ / ✅ ✅ / ✅
naive-bayes 25 ✅ / ✅ ✅ / ✅ 3 / 3 3440 / 3533 ✅ / ✅ ✅ / ✅
reactors 21 ✅ / ✅ ✅ / ✅ 1 / ✅ 1649 / 1644 ✅ / ✅ ✅ / ✅
reactors 25 ✅ / ✅ ✅ / ✅ ✅ / 2 1911 / 1819 ✅ / ✅ ✅ / ✅

@dd-octo-sts

dd-octo-sts Bot commented Jul 14, 2026

Copy link
Copy Markdown
Contributor

Benchmark Results (commit be3c3bf)

Pipeline: https://gitlab.ddbuild.io/DataDog/apm-reliability/benchmarking-platform/-/pipelines/124562849 Commit: be3c3bf93299da190c38a3a19b8b5f6a5acb5da1

⚠️ Significant outliers

  • 🔴 fj-kmeans (JDK 25): runtime +2.9% (2743→2822 ms)
  • 🔴 future-genetic (JDK 21): runtime +3.2% (2057→2122 ms)
  • 🔴 reactors (JDK 21): runtime +9.4% (15190→16624 ms)
Runtime details (per benchmark × JDK)
Benchmark JDK Latest Dev Δ (dev vs latest) Issues L/D
akka-uct 21 ✅ 10226 ms (21 iters) ✅ 10174 ms (21 iters) ≈ -0.5% (±10.9%) — / —
akka-uct 25 ✅ 8753 ms (24 iters) ✅ 8941 ms (24 iters) ≈ +2.1% (±10.1%) — / —
finagle-chirper 21 ✅ 5920 ms (33 iters) ✅ 6013 ms (33 iters) ≈ +1.6% (±25.1%) ⚠️ W:3 / ⚠️ W:3
finagle-chirper 25 ✅ 5449 ms (36 iters) ✅ 5493 ms (36 iters) ≈ +0.8% (±25.2%) ⚠️ W:3 / ⚠️ W:3
fj-kmeans 21 ✅ 2761 ms (68 iters) ✅ 2778 ms (67 iters) ≈ +0.6% (±2.7%) — / —
fj-kmeans 25 ✅ 2743 ms (68 iters) ✅ 2822 ms (66 iters) 🔴 +2.9% — / —
future-genetic 21 ✅ 2057 ms (91 iters) ✅ 2122 ms (87 iters) 🔴 +3.2% — / —
future-genetic 25 ✅ 2099 ms (88 iters) ✅ 2105 ms (88 iters) ≈ +0.3% (±2.5%) — / —
naive-bayes 21 ✅ 1276 ms (134 iters) ✅ 1252 ms (137 iters) ≈ -1.9% (±32.2%) — / —
naive-bayes 25 ✅ 1014 ms (169 iters) ✅ 1017 ms (168 iters) ≈ +0.3% (±31.5%) — / —
reactors 21 ✅ 15190 ms (15 iters) ✅ 16624 ms (15 iters) 🔴 +9.4% — / —
reactors 25 ✅ 18330 ms (15 iters) ✅ 18900 ms (15 iters) ≈ +3.1% (±4.4%) — / —
Internal counter details (ddprof)

ddprof internal counters, latest / dev (✅ = 0, · = unavailable):

Benchmark JDK Dropped rec Dropped jvmti Dropped trace Skipped WC AGCT fail Unwind fail
akka-uct 21 ✅ / ✅ ✅ / ✅ 2 / 1 2013 / 1963 ✅ / ✅ ✅ / ✅
akka-uct 25 ✅ / ✅ ✅ / ✅ 3 / 7 2311 / 2165 ✅ / ✅ ✅ / ✅
finagle-chirper 21 ✅ / ✅ ✅ / ✅ 4 / 1 8339 / 8974 ✅ / ✅ ✅ / ✅
finagle-chirper 25 ✅ / ✅ ✅ / ✅ 1 / 3 8490 / 8255 ✅ / ✅ ✅ / ✅
fj-kmeans 21 ✅ / ✅ ✅ / ✅ 4 / ✅ 1255 / 1304 ✅ / ✅ ✅ / ✅
fj-kmeans 25 ✅ / ✅ ✅ / ✅ 2 / 2 1272 / 1254 ✅ / ✅ ✅ / ✅
future-genetic 21 ✅ / ✅ ✅ / ✅ ✅ / 2 2940 / 2992 ✅ / ✅ ✅ / ✅
future-genetic 25 ✅ / ✅ ✅ / ✅ 3 / 2 2880 / 2882 ✅ / ✅ ✅ / ✅
naive-bayes 21 ✅ / ✅ ✅ / ✅ ✅ / ✅ ✅ / ✅ ✅ / ✅ ✅ / ✅
naive-bayes 25 ✅ / ✅ ✅ / ✅ 4 / 9 3513 / 3481 ✅ / ✅ ✅ / ✅
reactors 21 ✅ / ✅ ✅ / ✅ 1 / 3 1457 / 1670 ✅ / ✅ ✅ / ✅
reactors 25 ✅ / ✅ ✅ / ✅ 1 / ✅ 1843 / 1882 ✅ / ✅ ✅ / ✅

@dd-octo-sts

dd-octo-sts Bot commented Jul 14, 2026

Copy link
Copy Markdown
Contributor

Benchmark Results (commit ae3daa1)

Pipeline: https://gitlab.ddbuild.io/DataDog/apm-reliability/benchmarking-platform/-/pipelines/124604420 Commit: ae3daa139a1975f76dc0f558adfc98265d49fc40

⚠️ Significant outliers

  • 🔴 future-genetic (JDK 21): runtime +3.8% (2049→2126 ms)
Runtime details (per benchmark × JDK)
Benchmark JDK Latest Dev Δ (dev vs latest) Issues L/D
akka-uct 21 ✅ 10249 ms (21 iters) ✅ 10262 ms (21 iters) ≈ +0.1% (±10.8%) — / —
akka-uct 25 ✅ 8927 ms (24 iters) ✅ 9068 ms (24 iters) ≈ +1.6% (±10.9%) — / —
finagle-chirper 21 ✅ 5962 ms (33 iters) ✅ 6010 ms (33 iters) ≈ +0.8% (±25.6%) ⚠️ W:3 / ⚠️ W:3
finagle-chirper 25 ✅ 5482 ms (36 iters) ✅ 5470 ms (36 iters) ≈ -0.2% (±23.8%) ⚠️ W:3 / ⚠️ W:3
fj-kmeans 21 ✅ 2712 ms (69 iters) ✅ 2721 ms (69 iters) ≈ +0.3% (±2.7%) — / —
fj-kmeans 25 ✅ 2829 ms (66 iters) ✅ 2855 ms (66 iters) ≈ +0.9% (±2.6%) — / —
future-genetic 21 ✅ 2049 ms (90 iters) ✅ 2126 ms (88 iters) 🔴 +3.8% — / —
future-genetic 25 ✅ 2047 ms (91 iters) ✅ 2024 ms (92 iters) ≈ -1.1% (±2.7%) — / —
naive-bayes 21 ✅ 1266 ms (135 iters) ✅ 1352 ms (127 iters) ≈ +6.8% (±33.9%) — / —
naive-bayes 25 ✅ 1013 ms (169 iters) ✅ 1026 ms (166 iters) ≈ +1.3% (±32%) — / —
reactors 21 ✅ 16418 ms (15 iters) ✅ 15608 ms (15 iters) ≈ -4.9% (±8.2%) — / —
reactors 25 ✅ 18164 ms (15 iters) ✅ 17971 ms (15 iters) ≈ -1.1% (±6.4%) — / —
Internal counter details (ddprof)

ddprof internal counters, latest / dev (✅ = 0, · = unavailable):

Benchmark JDK Dropped rec Dropped jvmti Dropped trace Skipped WC AGCT fail Unwind fail
akka-uct 21 ✅ / ✅ ✅ / ✅ 1 / ✅ 1939 / 2026 ✅ / ✅ ✅ / ✅
akka-uct 25 ✅ / ✅ ✅ / ✅ 4 / 5 2164 / 2347 ✅ / ✅ ✅ / ✅
finagle-chirper 21 ✅ / ✅ ✅ / ✅ 1 / 5 8291 / 8431 ✅ / ✅ ✅ / ✅
finagle-chirper 25 ✅ / ✅ ✅ / ✅ ✅ / ✅ 8283 / 8356 ✅ / ✅ ✅ / ✅
fj-kmeans 21 ✅ / ✅ ✅ / ✅ 1 / 2 1278 / 1291 ✅ / ✅ ✅ / ✅
fj-kmeans 25 ✅ / ✅ ✅ / ✅ 1 / 1 1274 / 1286 ✅ / ✅ ✅ / ✅
future-genetic 21 ✅ / ✅ ✅ / ✅ ✅ / ✅ 2934 / 3045 ✅ / ✅ ✅ / ✅
future-genetic 25 ✅ / ✅ ✅ / ✅ 3 / 2 2890 / 2824 ✅ / ✅ ✅ / ✅
naive-bayes 21 ✅ / ✅ ✅ / ✅ 5 / 7 3502 / 3552 ✅ / ✅ ✅ / ✅
naive-bayes 25 ✅ / ✅ ✅ / ✅ 5 / 3 3464 / 3429 ✅ / ✅ ✅ / ✅
reactors 21 ✅ / ✅ ✅ / ✅ ✅ / 2 1765 / 1536 ✅ / ✅ ✅ / ✅
reactors 25 ✅ / ✅ ✅ / ✅ 1 / 1 1844 / 1973 ✅ / ✅ ✅ / ✅

@dd-octo-sts

dd-octo-sts Bot commented Jul 15, 2026

Copy link
Copy Markdown
Contributor

Benchmark Results (commit 2a3e926)

Pipeline: https://gitlab.ddbuild.io/DataDog/apm-reliability/benchmarking-platform/-/pipelines/124688617 Commit: 2a3e9267d20b3eff8dbff7b23dcc5bdbb7484b15

✅ Within expected boundaries

No significant runtime deltas (all within run-to-run noise) and no internal-counter outliers.

Runtime details (per benchmark × JDK)
Benchmark JDK Latest Dev Δ (dev vs latest) Issues L/D
akka-uct 21 ✅ 10237 ms (21 iters) ✅ 10317 ms (21 iters) ≈ +0.8% (±11.4%) — / —
akka-uct 25 ✅ 8705 ms (24 iters) ✅ 8823 ms (24 iters) ≈ +1.4% (±10%) — / —
finagle-chirper 21 ✅ 5995 ms (33 iters) ✅ 6064 ms (33 iters) ≈ +1.2% (±25.1%) ⚠️ W:3 / ⚠️ W:3
finagle-chirper 25 ✅ 5468 ms (36 iters) ✅ 5463 ms (36 iters) ≈ -0.1% (±24.1%) ⚠️ W:3 / ⚠️ W:3
fj-kmeans 21 ✅ 2779 ms (67 iters) ✅ 2838 ms (66 iters) ≈ +2.1% (±2.7%) — / —
fj-kmeans 25 ✅ 2754 ms (68 iters) ✅ 2817 ms (66 iters) ≈ +2.3% (±2.7%) — / —
future-genetic 21 ✅ 2106 ms (88 iters) ✅ 2121 ms (88 iters) ≈ +0.7% (±2.7%) — / —
future-genetic 25 ✅ 2095 ms (89 iters) ✅ 2057 ms (90 iters) ≈ -1.8% (±2.5%) — / —
naive-bayes 21 ✅ 1246 ms (137 iters) ✅ 1305 ms (132 iters) ≈ +4.7% (±33%) — / —
naive-bayes 25 ✅ 1015 ms (168 iters) ✅ 1011 ms (169 iters) ≈ -0.4% (±31.8%) — / —
reactors 21 ✅ 16124 ms (15 iters) ✅ 15778 ms (15 iters) ≈ -2.1% (±8.8%) — / —
reactors 25 ✅ 18418 ms (15 iters) ✅ 18826 ms (15 iters) ≈ +2.2% (±4.5%) — / —
Internal counter details (ddprof)

ddprof internal counters, latest / dev (✅ = 0, · = unavailable):

Benchmark JDK Dropped rec Dropped jvmti Dropped trace Skipped WC AGCT fail Unwind fail
akka-uct 21 ✅ / ✅ ✅ / ✅ 1 / 3 2039 / 1925 ✅ / ✅ ✅ / ✅
akka-uct 25 ✅ / ✅ ✅ / ✅ 2 / 4 2332 / 2260 ✅ / ✅ ✅ / ✅
finagle-chirper 21 ✅ / ✅ ✅ / ✅ 2 / 3 8678 / 8423 ✅ / ✅ ✅ / ✅
finagle-chirper 25 ✅ / ✅ ✅ / ✅ 3 / 1 8253 / 8348 ✅ / ✅ ✅ / ✅
fj-kmeans 21 ✅ / ✅ ✅ / ✅ 1 / 3 1268 / 1259 ✅ / ✅ ✅ / ✅
fj-kmeans 25 ✅ / ✅ ✅ / ✅ 2 / 3 1259 / 1255 ✅ / ✅ ✅ / ✅
future-genetic 21 ✅ / ✅ ✅ / ✅ 3 / 3 2949 / 2960 ✅ / ✅ ✅ / ✅
future-genetic 25 ✅ / ✅ ✅ / ✅ ✅ / 1 2898 / 2861 ✅ / ✅ ✅ / ✅
naive-bayes 21 ✅ / ✅ ✅ / ✅ 3 / 5 3484 / 3518 ✅ / ✅ ✅ / ✅
naive-bayes 25 ✅ / ✅ ✅ / ✅ 1 / 1 3492 / 3463 ✅ / ✅ ✅ / ✅
reactors 21 ✅ / ✅ ✅ / ✅ ✅ / ✅ 1607 / 1556 ✅ / ✅ ✅ / ✅
reactors 25 ✅ / ✅ ✅ / ✅ 1 / ✅ 1986 / 1947 ✅ / ✅ ✅ / ✅

@dd-octo-sts

dd-octo-sts Bot commented Jul 15, 2026

Copy link
Copy Markdown
Contributor

Benchmark Results (commit d1f2a0f)

Pipeline: https://gitlab.ddbuild.io/DataDog/apm-reliability/benchmarking-platform/-/pipelines/124747414 Commit: d1f2a0f60f3efc36e72dfe0877b66f17c6cd2431

⚠️ Significant outliers

  • 🔴 future-genetic (JDK 21): runtime +5.5% (2040→2152 ms)
  • 🔴 future-genetic (JDK 25): runtime +3.1% (2029→2091 ms)
Runtime details (per benchmark × JDK)
Benchmark JDK Latest Dev Δ (dev vs latest) Issues L/D
akka-uct 21 ✅ 10284 ms (21 iters) ✅ 10144 ms (21 iters) ≈ -1.4% (±11.2%) — / —
akka-uct 25 ✅ 8813 ms (24 iters) ✅ 8820 ms (24 iters) ≈ +0.1% (±9.7%) — / —
finagle-chirper 21 ✅ 6022 ms (33 iters) ✅ 6007 ms (33 iters) ≈ -0.2% (±25.4%) ⚠️ W:3 / ⚠️ W:3
finagle-chirper 25 ✅ 5472 ms (36 iters) ✅ 5464 ms (36 iters) ≈ -0.1% (±24.7%) ⚠️ W:3 / ⚠️ W:3
fj-kmeans 21 ✅ 2765 ms (68 iters) ✅ 2829 ms (66 iters) ≈ +2.3% (±2.7%) — / —
fj-kmeans 25 ✅ 2804 ms (66 iters) ✅ 2813 ms (66 iters) ≈ +0.3% (±2.6%) — / —
future-genetic 21 ✅ 2040 ms (91 iters) ✅ 2152 ms (86 iters) 🔴 +5.5% — / —
future-genetic 25 ✅ 2029 ms (92 iters) ✅ 2091 ms (89 iters) 🔴 +3.1% — / —
naive-bayes 21 ✅ 1270 ms (136 iters) ✅ 1270 ms (134 iters) ≈ 0% (±32.5%) — / —
naive-bayes 25 ✅ 1019 ms (168 iters) ✅ 1029 ms (166 iters) ≈ +1% (±31.7%) — / —
reactors 21 ✅ 16566 ms (15 iters) ✅ 16611 ms (15 iters) ≈ +0.3% (±7.3%) — / —
reactors 25 ✅ 18343 ms (15 iters) ✅ 18406 ms (15 iters) ≈ +0.3% (±6.8%) — / —
Internal counter details (ddprof)

ddprof internal counters, latest / dev (✅ = 0, · = unavailable):

Benchmark JDK Dropped rec Dropped jvmti Dropped trace Skipped WC AGCT fail Unwind fail
akka-uct 21 ✅ / ✅ ✅ / ✅ 1 / 3 2015 / 1901 ✅ / ✅ ✅ / ✅
akka-uct 25 ✅ / ✅ ✅ / ✅ 5 / 3 2301 / 2165 ✅ / ✅ ✅ / ✅
finagle-chirper 21 ✅ / ✅ ✅ / ✅ 2 / 3 8670 / 8927 ✅ / ✅ ✅ / ✅
finagle-chirper 25 ✅ / ✅ ✅ / ✅ 3 / 1 8793 / 8343 ✅ / ✅ ✅ / ✅
fj-kmeans 21 ✅ / ✅ ✅ / ✅ 2 / 3 1265 / 1259 ✅ / ✅ ✅ / ✅
fj-kmeans 25 ✅ / ✅ ✅ / ✅ 7 / ✅ 1282 / 1256 ✅ / ✅ ✅ / ✅
future-genetic 21 ✅ / ✅ ✅ / ✅ ✅ / 1 2964 / 2930 ✅ / ✅ ✅ / ✅
future-genetic 25 ✅ / ✅ ✅ / ✅ 1 / 3 2932 / 2896 ✅ / ✅ ✅ / ✅
naive-bayes 21 ✅ / ✅ ✅ / ✅ 7 / 6 3525 / 3504 ✅ / ✅ ✅ / ✅
naive-bayes 25 ✅ / ✅ ✅ / ✅ 4 / 4 3474 / 3487 ✅ / ✅ ✅ / ✅
reactors 21 ✅ / ✅ ✅ / ✅ ✅ / ✅ 1770 / 1625 ✅ / ✅ ✅ / ✅
reactors 25 ✅ / ✅ ✅ / ✅ ✅ / ✅ 1745 / 1812 ✅ / ✅ ✅ / ✅

@dd-octo-sts

dd-octo-sts Bot commented Jul 15, 2026

Copy link
Copy Markdown
Contributor

Benchmark Results (commit 2ef0fd2)

Pipeline: https://gitlab.ddbuild.io/DataDog/apm-reliability/benchmarking-platform/-/pipelines/124764606 Commit: 2ef0fd2262b33c27ea2fa91c61a2af1f0ed72c51

✅ Within expected boundaries

No significant runtime deltas (all within run-to-run noise) and no internal-counter outliers.

Runtime details (per benchmark × JDK)
Benchmark JDK Latest Dev Δ (dev vs latest) Issues L/D
akka-uct 21 ✅ 10323 ms (21 iters) ✅ 10330 ms (21 iters) ≈ +0.1% (±11%) — / —
akka-uct 25 ✅ 8930 ms (24 iters) ✅ 8804 ms (24 iters) ≈ -1.4% (±9.9%) — / —
finagle-chirper 21 ✅ 5975 ms (33 iters) ✅ 5985 ms (33 iters) ≈ +0.2% (±25.2%) ⚠️ W:3 / ⚠️ W:3
finagle-chirper 25 ✅ 5457 ms (36 iters) ✅ 5497 ms (36 iters) ≈ +0.7% (±24.6%) ⚠️ W:3 / ⚠️ W:3
fj-kmeans 21 ✅ 2731 ms (68 iters) ✅ 2713 ms (69 iters) ≈ -0.7% (±2.7%) — / —
fj-kmeans 25 ✅ 2834 ms (66 iters) ✅ 2834 ms (66 iters) ≈ 0% (±2.6%) — / —
future-genetic 21 ✅ 2066 ms (89 iters) ✅ 2079 ms (89 iters) ≈ +0.6% (±2.6%) — / —
future-genetic 25 ✅ 2093 ms (88 iters) ✅ 2045 ms (90 iters) ≈ -2.3% (±2.6%) — / —
naive-bayes 21 ✅ 1288 ms (133 iters) ✅ 1313 ms (130 iters) ≈ +1.9% (±32.9%) — / —
naive-bayes 25 ✅ 1013 ms (168 iters) ✅ 1026 ms (167 iters) ≈ +1.3% (±32%) — / —
reactors 21 ✅ 15976 ms (16 iters) ✅ 16322 ms (15 iters) ≈ +2.2% (±7.5%) — / —
reactors 25 ✅ 18509 ms (15 iters) ✅ 17942 ms (15 iters) ≈ -3.1% (±3.7%) — / —
Internal counter details (ddprof)

ddprof internal counters, latest / dev (✅ = 0, · = unavailable):

Benchmark JDK Dropped rec Dropped jvmti Dropped trace Skipped WC AGCT fail Unwind fail
akka-uct 21 ✅ / ✅ ✅ / ✅ 2 / 1 2006 / 1959 ✅ / ✅ ✅ / ✅
akka-uct 25 ✅ / ✅ ✅ / ✅ 2 / 1 2366 / 2090 ✅ / ✅ ✅ / ✅
finagle-chirper 21 ✅ / ✅ ✅ / ✅ 4 / 3 8556 / 8619 ✅ / ✅ ✅ / ✅
finagle-chirper 25 ✅ / ✅ ✅ / ✅ 2 / 1 8468 / 8270 ✅ / ✅ ✅ / ✅
fj-kmeans 21 ✅ / ✅ ✅ / ✅ 1 / ✅ 1277 / 1261 ✅ / ✅ ✅ / ✅
fj-kmeans 25 ✅ / ✅ ✅ / ✅ 2 / 3 1284 / 1271 ✅ / ✅ ✅ / ✅
future-genetic 21 ✅ / ✅ ✅ / ✅ 4 / 2 2975 / 2885 ✅ / ✅ ✅ / ✅
future-genetic 25 ✅ / ✅ ✅ / ✅ ✅ / ✅ 2883 / 2894 ✅ / ✅ ✅ / ✅
naive-bayes 21 ✅ / ✅ ✅ / ✅ 3 / 5 3510 / 3526 ✅ / ✅ ✅ / ✅
naive-bayes 25 ✅ / ✅ ✅ / ✅ 6 / 12 3449 / 3487 ✅ / ✅ ✅ / ✅
reactors 21 ✅ / ✅ ✅ / ✅ ✅ / ✅ 1788 / 1670 ✅ / ✅ ✅ / ✅
reactors 25 ✅ / ✅ ✅ / ✅ ✅ / 1 1867 / 1829 ✅ / ✅ ✅ / ✅

@kaahos kaahos left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I've started to take a look at it and left some comments!

Comment thread utils/run-chaos-harness.sh
Comment thread utils/run-chaos-harness.sh Outdated
Comment thread ddprof-lib/src/test/cpp/frame_ut.cpp
@dd-octo-sts

dd-octo-sts Bot commented Jul 15, 2026

Copy link
Copy Markdown
Contributor

Benchmark Results (commit 08390ce)

Pipeline: https://gitlab.ddbuild.io/DataDog/apm-reliability/benchmarking-platform/-/pipelines/124799195 Commit: 08390ce73f04a980481c735e9026a9f6efce763d

⚠️ Significant outliers

  • 🔴 future-genetic (JDK 21): runtime +5.2% (2027→2133 ms)
  • 🔴 future-genetic (JDK 25): runtime +3.9% (2031→2110 ms)
Runtime details (per benchmark × JDK)
Benchmark JDK Latest Dev Δ (dev vs latest) Issues L/D
akka-uct 21 ✅ 10375 ms (21 iters) ✅ 10149 ms (21 iters) ≈ -2.2% (±10.8%) — / —
akka-uct 25 ✅ 8799 ms (24 iters) ✅ 8810 ms (24 iters) ≈ +0.1% (±9.8%) — / —
finagle-chirper 21 ✅ 6004 ms (33 iters) ✅ 5987 ms (33 iters) ≈ -0.3% (±24.9%) ⚠️ W:3 / ⚠️ W:3
finagle-chirper 25 ✅ 5479 ms (36 iters) ✅ 5475 ms (36 iters) ≈ -0.1% (±24.1%) ⚠️ W:3 / ⚠️ W:3
fj-kmeans 21 ✅ 2749 ms (68 iters) ✅ 2820 ms (66 iters) ≈ +2.6% (±2.6%) — / —
fj-kmeans 25 ✅ 2871 ms (66 iters) ✅ 2849 ms (66 iters) ≈ -0.8% (±2.6%) — / —
future-genetic 21 ✅ 2027 ms (92 iters) ✅ 2133 ms (88 iters) 🔴 +5.2% — / —
future-genetic 25 ✅ 2031 ms (91 iters) ✅ 2110 ms (88 iters) 🔴 +3.9% — / —
naive-bayes 21 ✅ 1299 ms (131 iters) ✅ 1319 ms (131 iters) ≈ +1.5% (±32.8%) — / —
naive-bayes 25 ✅ 1010 ms (170 iters) ✅ 1014 ms (169 iters) ≈ +0.4% (±31.6%) — / —
reactors 21 ✅ 16954 ms (15 iters) ✅ 16040 ms (15 iters) ≈ -5.4% (±7.8%) — / —
reactors 25 ✅ 18876 ms (15 iters) ✅ 18543 ms (15 iters) ≈ -1.8% (±3.6%) — / —
Internal counter details (ddprof)

ddprof internal counters, latest / dev (✅ = 0, · = unavailable):

Benchmark JDK Dropped rec Dropped jvmti Dropped trace Skipped WC AGCT fail Unwind fail
akka-uct 21 ✅ / ✅ ✅ / ✅ ✅ / 3 1961 / 2029 ✅ / ✅ ✅ / ✅
akka-uct 25 ✅ / ✅ ✅ / ✅ 1 / 2 2142 / 2180 ✅ / ✅ ✅ / ✅
finagle-chirper 21 ✅ / ✅ ✅ / ✅ 3 / 2 8351 / 8465 ✅ / ✅ ✅ / ✅
finagle-chirper 25 ✅ / ✅ ✅ / ✅ 4 / ✅ 8501 / 8600 ✅ / ✅ ✅ / ✅
fj-kmeans 21 ✅ / ✅ ✅ / ✅ ✅ / 1 1273 / 1282 ✅ / ✅ ✅ / ✅
fj-kmeans 25 ✅ / ✅ ✅ / ✅ 2 / 1 1308 / 1277 ✅ / ✅ ✅ / ✅
future-genetic 21 ✅ / ✅ ✅ / ✅ 1 / 2 3025 / 2980 ✅ / ✅ ✅ / ✅
future-genetic 25 ✅ / ✅ ✅ / ✅ 2 / 1 2846 / 2882 ✅ / ✅ ✅ / ✅
naive-bayes 21 ✅ / ✅ ✅ / ✅ 4 / 5 3479 / 3552 ✅ / ✅ ✅ / ✅
naive-bayes 25 ✅ / ✅ ✅ / ✅ 5 / 3 3476 / 3468 ✅ / ✅ ✅ / ✅
reactors 21 ✅ / ✅ ✅ / ✅ 1 / 2 1819 / 1741 ✅ / ✅ ✅ / ✅
reactors 25 ✅ / ✅ ✅ / ✅ ✅ / 2 1852 / 1863 ✅ / ✅ ✅ / ✅

@dd-octo-sts

dd-octo-sts Bot commented Jul 15, 2026

Copy link
Copy Markdown
Contributor

Benchmark Results (commit 68ceb93)

Pipeline: https://gitlab.ddbuild.io/DataDog/apm-reliability/benchmarking-platform/-/pipelines/124817306 Commit: 68ceb93ed318cd1ea52953aa3aaad1bfcaa0a422

⚠️ Significant outliers

  • 🟢 future-genetic (JDK 25): runtime -3.2% (2069→2002 ms)
Runtime details (per benchmark × JDK)
Benchmark JDK Latest Dev Δ (dev vs latest) Issues L/D
akka-uct 21 ✅ 10309 ms (21 iters) ✅ 10255 ms (21 iters) ≈ -0.5% (±11.3%) — / —
akka-uct 25 ✅ 8778 ms (24 iters) ✅ 8848 ms (24 iters) ≈ +0.8% (±10.4%) — / —
finagle-chirper 21 ✅ 6033 ms (33 iters) ✅ 5964 ms (33 iters) ≈ -1.1% (±25.4%) ⚠️ W:3 / ⚠️ W:3
finagle-chirper 25 ✅ 5465 ms (36 iters) ✅ 5488 ms (36 iters) ≈ +0.4% (±24.2%) ⚠️ W:3 / ⚠️ W:3
fj-kmeans 21 ✅ 2779 ms (67 iters) ✅ 2736 ms (68 iters) ≈ -1.5% (±2.7%) — / —
fj-kmeans 25 ✅ 2839 ms (66 iters) ✅ 2842 ms (66 iters) ≈ +0.1% (±2.6%) — / —
future-genetic 21 ✅ 2039 ms (90 iters) ✅ 2072 ms (89 iters) ≈ +1.6% (±2.5%) — / —
future-genetic 25 ✅ 2069 ms (89 iters) ✅ 2002 ms (92 iters) 🟢 -3.2% — / —
naive-bayes 21 ✅ 1245 ms (138 iters) ✅ 1288 ms (133 iters) ≈ +3.5% (±33.1%) — / —
naive-bayes 25 ✅ 1022 ms (167 iters) ✅ 1028 ms (166 iters) ≈ +0.6% (±32.1%) — / —
reactors 21 ✅ 16345 ms (15 iters) ✅ 16388 ms (15 iters) ≈ +0.3% (±8.8%) — / —
reactors 25 ✅ 18285 ms (15 iters) ✅ 18580 ms (15 iters) ≈ +1.6% (±4.4%) — / —
Internal counter details (ddprof)

ddprof internal counters, latest / dev (✅ = 0, · = unavailable):

Benchmark JDK Dropped rec Dropped jvmti Dropped trace Skipped WC AGCT fail Unwind fail
akka-uct 21 ✅ / ✅ ✅ / ✅ 3 / 3 2006 / 2091 ✅ / ✅ ✅ / ✅
akka-uct 25 ✅ / ✅ ✅ / ✅ ✅ / 1 2306 / 2458 ✅ / ✅ ✅ / ✅
finagle-chirper 21 ✅ / ✅ ✅ / ✅ 5 / 3 8510 / 8550 ✅ / ✅ ✅ / ✅
finagle-chirper 25 ✅ / ✅ ✅ / ✅ 2 / 2 8164 / 8361 ✅ / ✅ ✅ / ✅
fj-kmeans 21 ✅ / ✅ ✅ / ✅ ✅ / ✅ ✅ / ✅ ✅ / ✅ ✅ / ✅
fj-kmeans 25 ✅ / ✅ ✅ / ✅ 2 / 4 1265 / 1270 ✅ / ✅ ✅ / ✅
future-genetic 21 ✅ / ✅ ✅ / ✅ ✅ / 1 2929 / 2905 ✅ / ✅ ✅ / ✅
future-genetic 25 ✅ / ✅ ✅ / ✅ 4 / 2 2873 / 2848 ✅ / ✅ ✅ / ✅
naive-bayes 21 ✅ / ✅ ✅ / ✅ 7 / 2 3570 / 3504 ✅ / ✅ ✅ / ✅
naive-bayes 25 ✅ / ✅ ✅ / ✅ 10 / 5 3485 / 3462 ✅ / ✅ ✅ / ✅
reactors 21 ✅ / ✅ ✅ / ✅ 1 / ✅ 1722 / 1701 ✅ / ✅ ✅ / ✅
reactors 25 ✅ / ✅ ✅ / ✅ 1 / ✅ 1897 / 1886 ✅ / ✅ ✅ / ✅

@dd-octo-sts

dd-octo-sts Bot commented Jul 16, 2026

Copy link
Copy Markdown
Contributor

Benchmark Results (commit 8c1402d)

Pipeline: https://gitlab.ddbuild.io/DataDog/apm-reliability/benchmarking-platform/-/pipelines/124958407 Commit: 8c1402d3b80d637efce12823fb00f44ef3f4d47d

⚠️ Significant outliers

  • 🟢 future-genetic (JDK 25): runtime -3.9% (2140→2057 ms)
Runtime details (per benchmark × JDK)
Benchmark JDK Latest Dev Δ (dev vs latest) Issues L/D
akka-uct 21 ✅ 10448 ms (21 iters) ✅ 10477 ms (21 iters) ≈ +0.3% (±11.6%) — / —
akka-uct 25 ✅ 8898 ms (24 iters) ✅ 8852 ms (24 iters) ≈ -0.5% (±10%) — / —
finagle-chirper 21 ✅ 6046 ms (33 iters) ✅ 5993 ms (33 iters) ≈ -0.9% (±25.1%) ⚠️ W:3 / ⚠️ W:3
finagle-chirper 25 ✅ 5523 ms (36 iters) ✅ 5495 ms (36 iters) ≈ -0.5% (±25.6%) ⚠️ W:3 / ⚠️ W:3
fj-kmeans 21 ✅ 2786 ms (68 iters) ✅ 2717 ms (68 iters) ≈ -2.5% (±2.7%) — / —
fj-kmeans 25 ✅ 2774 ms (67 iters) ✅ 2827 ms (66 iters) ≈ +1.9% (±2.6%) — / —
future-genetic 25 ✅ 2140 ms (87 iters) ✅ 2057 ms (90 iters) 🟢 -3.9% — / —
naive-bayes 21 ✅ 1248 ms (137 iters) ✅ 1259 ms (136 iters) ≈ +0.9% (±32.7%) — / —
naive-bayes 25 ✅ 994 ms (172 iters) ✅ 990 ms (172 iters) ≈ -0.4% (±31.9%) — / —
reactors 21 ✅ 15822 ms (15 iters) ✅ 15857 ms (15 iters) ≈ +0.2% (±8.1%) — / —
reactors 25 ✅ 18626 ms (15 iters) ✅ 18484 ms (15 iters) ≈ -0.8% (±4.2%) — / —
Internal counter details (ddprof)

ddprof internal counters, latest / dev (✅ = 0, · = unavailable):

Benchmark JDK Dropped rec Dropped jvmti Dropped trace Skipped WC AGCT fail Unwind fail
akka-uct 21 ✅ / ✅ ✅ / ✅ 1 / ✅ 1960 / 1971 ✅ / ✅ ✅ / ✅
akka-uct 25 ✅ / ✅ ✅ / ✅ 3 / 4 2212 / 2311 ✅ / ✅ ✅ / ✅
finagle-chirper 21 ✅ / ✅ ✅ / ✅ 3 / 2 9050 / 8435 ✅ / ✅ ✅ / ✅
finagle-chirper 25 ✅ / ✅ ✅ / ✅ 1 / 1 8780 / 8664 ✅ / ✅ ✅ / ✅
fj-kmeans 21 ✅ / ✅ ✅ / ✅ 3 / 2 1290 / 1255 ✅ / ✅ ✅ / ✅
fj-kmeans 25 ✅ / ✅ ✅ / ✅ ✅ / 3 1293 / 1252 ✅ / ✅ ✅ / ✅
future-genetic 21 ✅ / ✅ ✅ / ✅ ✅ / ✅ ✅ / ✅ ✅ / ✅ ✅ / ✅
future-genetic 25 ✅ / ✅ ✅ / ✅ 2 / 1 2925 / 2912 ✅ / ✅ ✅ / ✅
naive-bayes 21 ✅ / ✅ ✅ / ✅ 4 / 1 3517 / 3529 ✅ / ✅ ✅ / ✅
naive-bayes 25 ✅ / ✅ ✅ / ✅ 2 / 2 3473 / 3496 ✅ / ✅ ✅ / ✅
reactors 21 ✅ / ✅ ✅ / ✅ 1 / ✅ 1529 / 1671 ✅ / ✅ ✅ / ✅
reactors 25 ✅ / ✅ ✅ / ✅ ✅ / ✅ 1863 / 1884 ✅ / ✅ ✅ / ✅

@dd-octo-sts

dd-octo-sts Bot commented Jul 16, 2026

Copy link
Copy Markdown
Contributor

Benchmark Results (commit 9ef1d89)

Pipeline: https://gitlab.ddbuild.io/DataDog/apm-reliability/benchmarking-platform/-/pipelines/124973098 Commit: 9ef1d899a68fdb5b044e5125cecbe3ec0ea44f79

⚠️ Significant outliers

  • 🔴 fj-kmeans (JDK 25): runtime +2.9% (2760→2841 ms)
  • 🟢 future-genetic (JDK 25): runtime -3.3% (2113→2043 ms)
Runtime details (per benchmark × JDK)
Benchmark JDK Latest Dev Δ (dev vs latest) Issues L/D
akka-uct 21 ✅ 10293 ms (21 iters) ✅ 10304 ms (21 iters) ≈ +0.1% (±11%) — / —
akka-uct 25 ✅ 8858 ms (24 iters) ✅ 8998 ms (24 iters) ≈ +1.6% (±10.7%) — / —
finagle-chirper 21 ✅ 5996 ms (33 iters) ✅ 5966 ms (33 iters) ≈ -0.5% (±25.6%) ⚠️ W:3 / ⚠️ W:3
finagle-chirper 25 ✅ 5557 ms (35 iters) ✅ 5528 ms (36 iters) ≈ -0.5% (±24.9%) ⚠️ W:3 / ⚠️ W:3
fj-kmeans 21 ✅ 2748 ms (68 iters) ✅ 2817 ms (66 iters) ≈ +2.5% (±2.6%) — / —
fj-kmeans 25 ✅ 2760 ms (68 iters) ✅ 2841 ms (66 iters) 🔴 +2.9% — / —
future-genetic 21 ✅ 2089 ms (89 iters) ✅ 2118 ms (87 iters) ≈ +1.4% (±2.7%) — / —
future-genetic 25 ✅ 2113 ms (88 iters) ✅ 2043 ms (92 iters) 🟢 -3.3% — / —
naive-bayes 21 ✅ 1247 ms (137 iters) ✅ 1252 ms (136 iters) ≈ +0.4% (±33%) — / —
naive-bayes 25 ✅ 1009 ms (170 iters) ✅ 1022 ms (167 iters) ≈ +1.3% (±32.1%) — / —
reactors 21 ✅ 16251 ms (15 iters) ✅ 16951 ms (15 iters) ≈ +4.3% (±7.5%) — / —
reactors 25 ✅ 18539 ms (15 iters) ✅ 18552 ms (15 iters) ≈ +0.1% (±5.7%) — / —
Internal counter details (ddprof)

ddprof internal counters, latest / dev (✅ = 0, · = unavailable):

Benchmark JDK Dropped rec Dropped jvmti Dropped trace Skipped WC AGCT fail Unwind fail
akka-uct 21 ✅ / ✅ ✅ / ✅ 4 / 8 1960 / 1846 ✅ / ✅ ✅ / ✅
akka-uct 25 ✅ / ✅ ✅ / ✅ ✅ / 2 2318 / 2258 ✅ / ✅ ✅ / ✅
finagle-chirper 21 ✅ / ✅ ✅ / ✅ 2 / 3 8564 / 8577 ✅ / ✅ ✅ / ✅
finagle-chirper 25 ✅ / ✅ ✅ / ✅ ✅ / 2 8449 / 8280 ✅ / ✅ ✅ / ✅
fj-kmeans 21 ✅ / ✅ ✅ / ✅ 1 / ✅ 1246 / 1260 ✅ / ✅ ✅ / ✅
fj-kmeans 25 ✅ / ✅ ✅ / ✅ 3 / 1 1266 / 1291 ✅ / ✅ ✅ / ✅
future-genetic 21 ✅ / ✅ ✅ / ✅ 1 / 1 3004 / 2918 ✅ / ✅ ✅ / ✅
future-genetic 25 ✅ / ✅ ✅ / ✅ 1 / 3 2906 / 2986 ✅ / ✅ ✅ / ✅
naive-bayes 21 ✅ / ✅ ✅ / ✅ 4 / 5 3509 / 3504 ✅ / ✅ ✅ / ✅
naive-bayes 25 ✅ / ✅ ✅ / ✅ 3 / 1 3509 / 3520 ✅ / ✅ ✅ / ✅
reactors 21 ✅ / ✅ ✅ / ✅ 2 / 1 1647 / 1844 ✅ / ✅ ✅ / ✅
reactors 25 ✅ / ✅ ✅ / ✅ ✅ / 3 1869 / 1997 ✅ / ✅ ✅ / ✅

@jbachorik jbachorik requested review from kaahos and rkennke July 16, 2026 11:18

@rkennke rkennke left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Review

Overall this is careful, well-commented work — the antagonist and runner reflect a lot of hard-won operational knowledge (documented job IDs, hysteresis, keep-alive reasoning). My main concerns are scope and blast radius, not correctness of the core antagonist.

Key issues

1. Scope creep: the frame.h / frame_ut.cpp change is unrelated to this PR.
The isRawPointer gating change has nothing to do with the vthread antagonist or malloc defaults. The production change itself is correctencode() always sets ENCODED_MASK (frame.h:63) and RAW_POINTER_MASK is only ever set alongside it, so requiring ENCODED_MASK before trusting bit 30 is sound, and the new regression test is good. But bundling a production behavior change into a "chaos tooling" PR hides it from reviewers who'd otherwise scrutinize the packing logic. Recommend splitting it into its own PR.

2. Two tests were deleted with no explanation (frame_ut.cpp): FrameTypeEncodeTest.EncodedValuesArePositive and FrameTypeDecodeTest.DecodedTypeIsInValidRange. Both look like they'd still pass and both cover behavior orthogonal to the isRawPointer change. Deleting passing tests silently reduces coverage — if they were redundant or wrong, please say so; otherwise keep them.

3. MALLOC_CHECK_/MALLOC_PERTURB_ blast radius in ProfilerTestPlugin.kt. This applies to every ddprof-test task, not just the chaos suite.

  • Non-reproducible failures: MALLOC_PERTURB_ is (1..255).random() (and $((RANDOM % 255 + 1)) in the shell) and the value is never logged. When a run aborts on corruption you can't reproduce it with the same perturb byte. Consider logging the chosen value (Gradle test output + the runner's stdout).
  • Surfacing latent issues suite-wide is presumably intended, but worth calling out in the PR body — this can turn previously-green unrelated tests red.
  • Minor: the guard is !testEnv.containsKey("LD_PRELOAD"). If LD_PRELOAD is set in the process environment rather than the task's testEnv map, the guard won't see it. Confirm the sanitizer/tcmalloc configs all populate testEnv.

Smaller notes

  • MemoryGovernor System.gc() race: two threads can both observe critical == false, both set it, and both fire System.gc(). The comment promises a "one-shot nudge"; it's approximately-once, not once. Harmless, but the code is slightly weaker than the comment claims.
  • paceCalls.incrementAndGet() on every hot-loop iteration (MemoryGovernor) is a single contended AtomicLong shared across all antagonist threads — a cache-line hotspot that perturbs the very allocation timing you're stressing. A per-thread counter would avoid it if it ever matters.
  • fastCarrierScheduler is ThreadPoolExecutor(0, Integer.MAX_VALUE, …, SynchronousQueue) — unbounded platform threads, bounded only indirectly by MAX_STALE_RACERS = 1024. Worth confirming ~1024 OS carrier threads stay under the container thread/RSS ceilings on aarch64.
  • start() hard-fails on a VT-capable JDK without --add-opens (throws, crashing the harness). Intentional and documented, and run-chaos-harness.sh passes the flag — but it's a tight coupling: any alternate invocation path that forgets the flag hard-crashes at startup. Acceptable given it's test-only.
  • run-chaos-harness.sh find … -name a -o -name b relies on the implicit -print attaching to the whole OR expression. It works, but wrapping in \( … \) makes intent explicit and robust against a future added clause.
  • stopGracefully joins the three driver threads unconditionally. Safe here because a start() that threw is never registered in Main's running list, but a null-guard or comment would prevent a shutdown NPE from masking the real failure.

Correctness / tests / security

  • Correctness: the one production change (frame.h) is verified correct against the bit layout; semaphore acquire/release pairing in both antagonists correctly releases on the reflective-failure path (no permit leaks).
  • Test coverage: the new isRawPointer regression test is good; the two unexplained deletions are the gap (#2).
  • Conventions: comment style, copyright headers, and Jira-only-in-PR-body all respected.
  • Security: test/CI tooling only; the dtdg.co download and Maven snapshot fallback are unchanged from the prior script.

Bottom line

The chaos antagonist and runner rework are solid. Before merge I'd (1) split out the frame.h change, (2) restore or justify the two deleted frame_ut.cpp tests, and (3) log the MALLOC_PERTURB_ value so glibc-detected aborts are reproducible. The rest is optional polish.

@jbachorik

Copy link
Copy Markdown
Collaborator Author

Ouch, the frame.h/cpp was supposed to go to a different PR. Will fix!

A raw, unencoded ASGCT BCI can coincidentally have bit 30 set on non-HotSpot
VMs; isRawPointer() must require ENCODED_MASK before trusting bit 30, not
just the HotSpot check.
Races tracer-style context propagate/activate/restore semantics against
virtual-thread carrier churn, targeting the ContextStorageMode.THREAD
stale-carrier DirectByteBuffer use-after-free.
…onist

MemoryGovernor watches heap/direct-memory usage and gates
DirectMemoryAntagonist.burstLoop() plus the other allocation-heavy
antagonists on it, nudging GC once on a critical watermark and exiting
cleanly on an early heap OOME while tolerating a late one.

VirtualThreadChurnAntagonist bounds in-flight virtual threads with a
semaphore: the default carrier pool has far fewer platform threads than a
batch submits, so an unthrottled submission rate outpaces execution and the
backlog of pending VirtualThread/Continuation objects grows without bound.
…rruption detection

utils/run-chaos-harness.sh is the new standalone entry point (usable from CI
or by hand); chaos_check.sh becomes a thin wrapper around it.

Also defaults MALLOC_CHECK_/MALLOC_PERTURB_ for glibc-backed test runs (this
script and the shared ddprof-test Gradle test-task configuration), turning
silent heap corruption into an immediate, attributable SIGABRT instead of a
crash much later in an unrelated allocation. Skipped on musl and whenever a
sanitizer/allocator already replaces malloc via LD_PRELOAD. The chosen
MALLOC_PERTURB_ byte is logged so a corruption abort can be reproduced.
…nded fast-carrier pool

MemoryGovernor: throttled/critical are now AtomicBoolean with
compareAndSet-guarded transitions, so a watermark crossing observed by
several antagonist threads at once escalates (and fires System.gc()) exactly
once instead of racing. paceCalls moves from a shared AtomicLong to a
per-thread counter, removing a cache-line contention point on every
antagonist's hot allocation loop.

VirtualThreadContextCascadeAntagonist: fastCarrierScheduler's max pool size
is now bounded by MAX_STALE_RACERS instead of Integer.MAX_VALUE (no headroom
lost, since that's already the hard cap on concurrent racers). stopGracefully
null-checks its driver threads so it's safe to call even if start() never ran
or failed partway through; same guard added to VirtualThreadChurnAntagonist.

run-chaos-harness.sh: the allocator-detection find commands now cap
-maxdepth 4 instead of unboundedly recursing /usr/lib, /usr/lib64, etc.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

AI sphinx:critical Sphinx: critical — human review required test:reliability

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants